package com.ruoyi.distributor.service;

import java.util.List;
import java.util.Map;

import com.ruoyi.distributor.domain.DistributionUser;
import com.ruoyi.distributor.domain.DistributorDetailVo;

/**
 * 分销用户信息Service接口
 * 
 * @author ruoyi
 * @date 2025-10-11
 */
public interface IDistributionUserService 
{
    /**
     * 查询分销用户信息
     * 
     * @param distributorId 分销用户信息主键
     * @return 分销用户信息
     */
    public DistributionUser selectDistributionUserByDistributorId(Long distributorId);

    /**
     * 查询分销用户信息
     *
     * @param userId 分销用户信息主键
     * @return 分销用户信息
     */
    public DistributionUser selectDistributionUserByUserId(Long userId);

    /**
     * 检查用户是否已开通分销
     *
     * @param userId 用户ID
     * @return 是否已开通分销
     */
    public boolean checkUserHasDistributor(Long userId);

    /**
     * 审核分销员申请
     *
     * @param distributorId 分销员ID
     * @param authStatus 审核状态
     * @param remark 审核备注
     * @return 结果
     */
    public int auditDistributor(Long distributorId, String authStatus, String remark);

    /**
     * 审核分销员申请 - 专门用于 updateDistributorApply 接口
     *
     * @param distributorId 分销员ID
     * @param authStatus 审核状态
     * @param remark 审核备注
     * @return 结果
     */
    public int auditDistributorApply(Long distributorId, String authStatus, String remark);

    /**
     * 分销员脱离上级关系
     *
     * @param distributorId 分销员ID
     * @param remark 脱离原因
     * @return 结果
     */
    public int unbindSuperiorRelation(Long distributorId, String remark);

    /**
     * 提交分销员申请
     *
     * @param distributionUser 分销用户信息
     * @return 结果
     */
    public int applyDistributor(DistributionUser distributionUser);

    /**
     * 查询分销用户信息列表
     *
     * @param distributionUser 分销用户信息
     * @return 分销用户信息集合
     */
    public List<DistributionUser> selectDistributionUserList(DistributionUser distributionUser);

    /**
     * 新增分销用户信息
     *
     * @param distributionUser 分销用户信息
     * @return 结果
     */
    public int insertDistributionUser(DistributionUser distributionUser);

    /**
     * 修改分销用户信息
     *
     * @param distributionUser 分销用户信息
     * @return 结果
     */
    public int updateDistributionUser(DistributionUser distributionUser);

    /**
     * 批量删除分销用户信息
     *
     * @param distributorIds 需要删除的分销用户信息主键集合
     * @return 结果
     */
    public int deleteDistributionUserByDistributorIds(Long[] distributorIds);

    /**
     * 删除分销用户信息信息
     *
     * @param distributorId 分销用户信息主键
     * @return 结果
     */
    public int deleteDistributionUserByDistributorId(Long distributorId);

    /**
     * 获取分销员详情信息
     * @param userId 用户ID
     * @return 分销员详情信息
     */
    public DistributorDetailVo getDistributorDetail(Long userId);

    /**
     * 获取分销员ID
     * @param userId 用户ID
     * @return 分销员ID
     */
    public Long selectDistributorWhereUserId(Long userId);

    /**
     * 获取待审核分销员数量
     */
    public int selectPendingDistributorCount();

    /**
     * 获取分销员汇总列表
     * @param distributor 分销员信息
     * @return 分销员汇总列表
     */
    public List<DistributionUser> selectDistributorSummaryList(DistributionUser distributor);

    /**
     * 获取所有分销员基础信息列表（仅包含ID和姓名）
     *
     * @return 分销员基础信息列表
     */
    public List<DistributionUser.DistributorBasicInfo> selectDistributorBasicList();

    /**
     * 记录分销操作日志
     *
     * @param distributorId 分销员ID
     * @param logType 日志类型
     * @param action 操作动作
     * @param changeDetail 变更详情
     */
    public void recordDistributionLog(Long distributorId, String logType, String action,
                                      String changeObject, String changeDetail, String remark);


    /**
     * 根据分销员编码查询分销用户信息
     *
     * @param distributorCode 分销员编码
     * @return 分销用户信息
     */
    public DistributionUser selectDistributionUserByDistributorCode(String distributorCode);

    /**
     * 绑定邀请关系
     *
     * @param inviteCode 邀请码
     * @param newDistributorId 新分销员ID
     * @return 结果
     */
    public int bindInvitationRelation(String inviteCode, Long newDistributorId);

    /**
     * 修改上级分销关系
     *
     * @param oldUser 旧分销员信息
     */
    public void updateSuperiorTeamRelationOnApproval(DistributionUser oldUser);

    /**
     * 自动绑定上级关系
     *
     * @param inviteCode 邀请码
     * @param userId 用户ID
     * @return 绑定结果
     */
    public int autoBindRelation(String inviteCode, Long userId);

    /**
     * 手动绑定上级分销员
     *
     * @param distributorId 当前分销员ID
     * @param superiorDistributorCode 上级分销员编码
     * @param remark 绑定备注
     * @return 绑定结果
     */
    public int bindSuperiorDistributor(Long distributorId, String superiorDistributorCode, String remark);

    /**
     * 禁用分销员
     *
     * @param distributorId 分销员ID
     * @param remark 禁用原因
     */
    public void disableDistributorAndHandleCommission(Long distributorId, String remark);

    /**
     * 生成分销员海报
     *
     * @param distributorId 分销员ID
     * @param productId 产品ID
     * @return 海报信息
     */
    Map<String, Object> generateProductPoster(Long distributorId, Long productId);
}